package com.itheima.atm;

import org.w3c.dom.ls.LSOutput;

import java.util.ArrayList;
import java.util.Random;
import java.util.Scanner;


/**
 * 操作类 操作账户信息
 */
public class ATM {
    //创建一个集合 存储账户对象 每添加一个账户 集合里就多一个
    private ArrayList<Account> accounts = new ArrayList<>();
    //键盘录入
    Scanner sc = new Scanner(System.in);
    private Account loginAcc;


    //定义一个方法 start() 展示欢迎页面
    public void start() {
        //创建一个死循环 while(true)
        while (true) {
            System.out.println("==欢迎进入黑马银行ATM系统==");
            System.out.println("1、用户登录");
            System.out.println("2、用户开户");
            System.out.println("请选择您要操作的命令:");
            int command = sc.nextInt();
            switch (command) {
                case 1://用户登录功能
                    //System.out.println("进入登录功能");
                    login();
                    break;
                case 2://用户开户功能
                    //System.out.println("进入开户功能");
                    createAccount();
                    break;
                default:
                    System.out.println("您输入的命令有误，请重新输入！");
            }
        }
    }

    //实现用户的登录功能
    private void login() {
        if (accounts.size() == 0) {
            System.out.println("当前系统无账户~~你在搞笑呢没开户就登录~");
        }
        while (true) {
            System.out.println("==系统登录操作==");
            System.out.println("请您输入登录卡号:");
            String idCard = sc.next();
            //创建一个账户对象 调用getAccountByIdCard()方法
            Account acc = getAccountByIdCard(idCard);
            //判断acc是否存在 存在 才可以登录账号
            if (acc != null) {
                while (true) {
                    System.out.println("请您输入登录密码:");
                    String password = sc.next();
                    //判断登录密码是否一致
                    if (acc.getPassword().equals(password)) {
                        //如果一致 提示登陆成功
                        System.out.println("恭喜您，尊贵的" + acc.getUserName() + "您已经成功进入登录系统，您的卡号是:" + acc.getIdCard());
                        System.out.println("春风得意马蹄疾，一日看尽长安花。 ");
                        //把acc账户 赋值给loginAcc  定义一个loginAcc
                        loginAcc = acc;
                        // 展示操作页面
                        showUserCommand();
                        return;//跳出页面
                    }//如果密码不一致
                    else {
                        System.out.println("密码输入错误，请重新输入！");
                    }
                }
            } else {
                System.out.println("系统中不存在该账户卡号~~，请重新输入卡号呀哥哥");
            }
        }
    }

    //展示用户的操作界面
    private void showUserCommand() {
        while (true) {
            System.out.println("===" + loginAcc.getUserName() + "您可以选择如下功能进行账户处理===");
            System.out.println("1、查询账户");
            System.out.println("2、存款");
            System.out.println("3、取款");
            System.out.println("4、转账");
            System.out.println("5、密码修改");
            System.out.println("6、退出");
            System.out.println("7、注销当前账户");
            System.out.println("请选择：");
            int command = sc.nextInt();
            // switch (command) {} 语句 来进入下一个页面
            switch (command) {
                case 1:
                    //查询账户功能
                    showLoginAccount();
                    break;
                case 2:
                    //存款功能
                    depositMoney();
                    break;
                case 3:
                    //取款功能
                    drawMoney();
                    break;
                case 4:
                    //转账功能
                    transfer();
                    break;
                case 5:
                    //修改密码功能
                    updatePassWord();
                    return;
                case 6:
                    // 退出功能
                    System.out.println("恭喜您，" + loginAcc.getUserName() + "已成功退出登录");
                    return;
                case 7:
                    //注销账户功能
                    if(deleteAccount()){
                    return;}else {
                        break;
                    }
                default:
                    System.out.println("您输入的命令错误，请重新输入");
            }
        }

    }
    //销户功能
    private boolean deleteAccount() {
        System.out.println("===欢迎进入银行销户界面===");
        //1.确认对方是否要销户（y/n）
        while(true) {
            System.out.println("是否确认销户？(y/n)");
            String choice = sc.next();
            //判断是否输入y或n
            if (choice.equals("y")) {
                //2.选择y 继续判断账户是否有钱
                if (loginAcc.getMoney() > 0) {
                    //3.若有钱 则提示账户内还有钱 无法销户
                    System.out.println("账户内还有钱，无法销户");
                    return false;
                }else {//4.若没钱，则销户 并提示销户成功 退出登陆页面
                    System.out.println("销户成功，您已退出登录，欢迎下次光临！~~~");
                    accounts.remove(loginAcc);
                    return true;
                }

            }else if (choice.equals("n")) {
                //选择 n 退出销户功能
                System.out.println("您已取消销户");
                return false;
            }else {
                System.out.println("您输入的命令有误，请重新输入！");
            }
        }
    }

    //修改密码功能
    private void updatePassWord() {
        System.out.println("=======欢迎您进入黑马银行密码修改界面========");
        //1.先输入当前的密码 判断当前的密码是否正确
        while(true){
            System.out.println("请输入当前密码：");
            String password = sc.next();
            //判断当前密码是否正确
            if (loginAcc.getPassword().equals(password)) {
                //2.当前账户的密码 和输入的密码正确 输入新密码
                while (true) {
                    System.out.println("请输入新密码：");
                    String newPassword = sc.next();
                    //3.再次输入新的密码 判断是否于上次密码一致 若一致则修改密码
                    System.out.println("请再次输入新密码：");
                    String okPassword = sc.next();
                    //判断两次输入的密码是否一致
                    if (newPassword.equals(okPassword)) {
                        //密码一致 修改密码成功
                        loginAcc.setPassword(newPassword);
                        System.out.println("修改密码成功，请重新登录");
                        return;
                    }else {
                        System.out.println("您输入的两次密码不一致，请重新输入：");
                    }
                }
            }else {
                System.out.println("您输入的密码有误，请重新输入：");
            }
        }
    }

    //转账功能
    private void transfer() {
        //首先判断系统中是否有其他的账户
        if (accounts.size() < 2) {//系统内没有其他账户
            System.out.println("系统内没有其他账户，无法进行转账~~");
            return;
        }
        //系统内有其他账户 继续判断自己的账户有没有钱
        if (loginAcc.getMoney() == 0) {//账户内没有钱
            System.out.println("您自己穷的1块钱都没有，就别转账了~~");
            return;
        }
        //账户有钱 系统也有其他账户 接下来要输入对方的卡号
        while (true) {
            //输入卡号 判断对方账户是否存在
            System.out.println("请输入转账的账户卡号：");
            String idCard = sc.next();
            Account acc = getAccountByIdCard(idCard);
            //判断对方账户是否存在
            if (acc != null) {
                //此时账户存在 继续认证对方账户的姓氏
                //先把对方账户账户的姓氏用*给替代
                String name = "*" + acc.getUserName().substring(1);
                while (true) {
                    //提示 你是否要给对方转账
                    System.out.println("您当前要为" + name + "转账！");
                    //认证对方的姓氏
                    System.out.println("请您输入姓氏确认:");
                    String preName = sc.next();
                    if (acc.getUserName().startsWith(preName)) {
                        //姓氏认证正确 继续判断是否金额足够
                        System.out.println("请输入转账金额：");
                        double money = sc.nextDouble();
                        //判断转账金额是否小于等于自己的余额 若小于 则转账成功 退出
                        if (money <= loginAcc.getMoney()) {
                            //转账的金额 小于 余额 转账成功
                            acc.setMoney(acc.getMoney() + money);
                            loginAcc.setMoney(loginAcc.getMoney() - money);
                            System.out.println("恭喜您，转账成功，您的余额为:" + loginAcc.getMoney());
                            return;
                        } else {
                            System.out.println("您输入的转账金额超过了余额，您最多可以转的金额为：" + loginAcc.getMoney());
                        }
                    } else {
                        System.out.println("您输入的姓氏有误，请重新输入！");
                    }
                }
            } else {//账户不存在 提示
                System.out.println("系统中不存在该账户卡号~~，请重新输入卡号");
            }
        }
    }

    //取款功能
    private void drawMoney() {
        //1.判断余额是否 >= 100元 如果不够 提示不允许取钱
        if (loginAcc.getMoney() < 100) {
            System.out.println("您的余额不足100元了，怎么取钱呀~");
            //余额不够100 直接退出
            return;
        }
        //此时余额大于100元 可以取钱
        while (true) {
            System.out.println("请输入取钱金额:");
            double money = sc.nextDouble();
            //判断余额是否充足 若余额不够 提示
            if (money <= loginAcc.getMoney()) {
                //余额充足 可以取钱 要判断是否大于限额
                if (money <= loginAcc.getLimit()) {
                    //取钱小于限额 可以取钱 提示取钱成功
                    loginAcc.setMoney(loginAcc.getMoney() - money);
                    System.out.println("恭喜您，亲爱的" + loginAcc.getUserName() + "取钱成功，您的余额为:" + loginAcc.getMoney());
                    break;
                } else {//取钱大于限额
                    System.out.println("取钱失败，您的取款金额大于限额，您每次取钱的限额为:" + loginAcc.getLimit());
                }

            } else {//余额不足 没法取钱
                System.out.println("余额不足，取钱失败,您当前剩余的余额为:" + loginAcc.getMoney());
            }
        }
    }

    //存款
    private void depositMoney() {
        System.out.println("请输入要存款的金额:");
        double money = sc.nextDouble();
        //更新余额 余额 + 要存的金额
        loginAcc.setMoney(loginAcc.getMoney() + money);
        System.out.println("恭喜您,亲爱的" + loginAcc.getUserName() + "已经成功存款" + money + "元，" +
                "您的余额为:" + loginAcc.getMoney());
    }


    //  展示当前用户的账户信息
    private void showLoginAccount() {
        System.out.println("===尊贵的" + loginAcc.getUserName() + ",您的的账户信息如下===");
        System.out.println("卡号：" + loginAcc.getIdCard());
        System.out.println("户主：" + loginAcc.getUserName());
        System.out.println("性别：" + loginAcc.getSex());
        System.out.println("余额：" + loginAcc.getMoney());
        System.out.println("每次取现额度：" + loginAcc.getLimit());
    }


    //实现用户的开户功能
    private void createAccount() {
        //1.创建一个账户对象
        Account account = new Account();

        //2.录入用户信息 把用户的信息存储到账户中
        System.out.println("==系统开户操作==");//录入用户名
        System.out.println("请输入您的账户用户名:");
        String name = sc.next();
        account.setUserName(name);

        while (true) {
            System.out.println("请输入您的性别:");//录入性别
            char sex = sc.next().charAt(0);
            if (sex == '男' || sex == '女') {
                account.setSex(sex);
                break;
            } else {
                System.out.println("您输入的性别有误，请重新输入！");
            }
        }

        while (true) {
            System.out.println("请您输入账户密码");//录入账户密码
            String password = sc.next();
            System.out.println("请您输入确认密码");
            String okPassword = sc.next();
            if (password.equals(okPassword)) {
                account.setPassword(password);
                break;
            } else {
                System.out.println("您输入的密码有误，请重新输入！");
            }
        }

        System.out.println("请您输入账户每次取现限额");//录入账户限额
        double limit = sc.nextDouble();
        account.setLimit(limit);

        // 生成卡号 8位且与前面的账户不重复 （1）创建一个方法 createIdCard()生成8位卡号
        //                            （2）调用getAccountByIdCard() 判断是否重复 若不重复 可以使用 把卡号赋值到账户对象
        String newIdCard = createIdCard();
        account.setIdCard(newIdCard);

        //3.把账户对象添加到集合中
        accounts.add(account);
        System.out.println("恭喜您，尊贵的" + account.getUserName() + "您开户成功，您的卡号是:" + account.getIdCard());


    }

    /**
     * 生成卡号
     *
     * @return
     */
    private String createIdCard() {
        Random random = new Random();
        //生成8位数的卡号
        while (true) {
            String cardId = "";
            for (int i = 0; i < 8; i++) {
                //使用循环 生成8个随机数字连起来作为卡号
                cardId += random.nextInt(10);
            }
            //判断cardId记住的卡号 是否与账户对象的卡号重复 没有重复才可以作为一个新的卡号返回
            // 定义一个方法 getAccountByIdCard
            Account acc = getAccountByIdCard(cardId);
            //如果 acc = null 则证明卡号不存在 可以使用
            if (acc == null) {
                return cardId;
            }
        }
    }

    //返回一个卡号 对应的账户对象
    private Account getAccountByIdCard(String cardId) {
        //遍历全部的账户对象
        for (int i = 0; i < accounts.size(); i++) {
            Account acc = accounts.get(i);
            if (acc.getIdCard().equals(cardId)) {
                return acc;
            }
        }
        return null;
    }
}
